package conf

import (
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	"mall-portalv2/library/common"
)

/**
* Author: joker
* TODO: test
* Date: 2022/8/16
* Time: 上午9:25
**/

func InitConf(path string) (*viper.Viper, error) {
	// alternatively, you can create a new viper instance.
	logrus.Println("开始读取配置文件")
	runtime_viper := viper.New()
	runtime_viper.SetConfigFile(path)
Readfile:
	if err := runtime_viper.ReadInConfig(); err != nil {
		// Handle errors reading the config file
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			// Config file not found; ignore ctx if desired
			if err := createFile(path); err != nil {
				panic(err)
			}
			goto Readfile
			return nil, err
		} else {
			// Config file was found but another ctx was produced
			logrus.Fatal("读取到文件，但是产生了意外中的错误, 错误信息为：", err)
			if err := createFile(path); err != nil {
				panic(err)
			}
			goto Readfile
			return nil, err
		}
	}
	logrus.Println("读取完毕进行下一步")
	// unmarshal config
	if err := runtime_viper.Unmarshal(&Config); err != nil {
		logrus.Fatal("无法映射数据结构体, 错误信息为: ", err)
	}

	return runtime_viper, nil
}

func createFile(path string) error {
	logrus.Printf("文件不存在，初始化创建基础配置模板---------------------")
	// 创建初始配置文件
	confContent := common.Replace(map[string]string{
		"{HashIDSalt}":    common.RandStringRunes(16),
		"{SessionSecret}": common.RandStringRunes(16),
	}, defaultConf)
	f, err := common.CreatNestedFile(path)
	if err != nil {
		logrus.Fatal("无法创建配置文件, 错误信息为：%s", err)
		return err
	}

	// 写入配置文件
	_, err = f.WriteString(confContent)
	if err != nil {
		logrus.Fatal("无法写入配置文件, 错误信息为：%s", err)
		return err
	}

	f.Close()
	logrus.Printf("基础配置模板初始化创建---------------------")
	return nil
}
